package java_thinking.unit_8._8_2;

/**
 * @Description : 域域静态方法需要注意之处
 *                1.不管是静态域还是静态方法，它不具备多态性，当实例是父级时，
 *                  对象引用的静态域或者静态方法都是父级对应的静态域或者静态方法，如果要使用父类的静态域要显示的使用super
 *                2.如果是非静态域或方法则遵循多态性，
 * @author: cww
 * @DateTime: 2019-02-28 23:00
 */

public class FieldStatic {
    public int field = 0;
    public int getField(){
        return field;
    }
}

/**
 * SunField实际上包含两个称为field的域：它自己和它从FieldStatic处得到的
 * ，然而在引用Sub中的field时所产生的默认域并非从FieldStatic中的field。
 * 因此为了获得FieldStatic的field，必须显示的知名super.field
 */
class SunField extends FieldStatic{
    public int field = 1;
    public int getField(){
        return field;
    }
    public int getSuperField(){
        return super.field;
    }
}


class FieldTest{
    public static void main(String[] args) {
        //如果对象向上转型了，此时对象中的域就是用父级的，而方法中使用的域还是子类的
        FieldStatic fieldStatic = new SunField();
        System.out.println("fieldStatic.field = "+fieldStatic.field+"\n"
                +"fieldStatic.getField() = "+fieldStatic.getField());
        //如果没有发生向上转型，那么对象中的 域和方法中的域都是自己的，为了获得父类的域必须用super
        SunField sunField = new SunField();
        System.out.println("sunField.field = "+sunField.field+"\n"
                +"sunField.getField() = "+sunField.getField()+"\n"
        +"sunField.getSuperField() = "+sunField.getSuperField());
    }
}

/**
 * 如果方法是静态的，他的行为就不具备多态性了，因为静态方法是与类关联的，并非与单个对象相关联的！！！
 */
class StaticSuper{
    public static String staticGet(){
        return "Base staticGet()";
    }
    public String dynamicGet(){
        return "Base dynamicGet()";
    }
}

class StaticSub extends StaticSuper{
    public static String staticGet(){
        return "StaticSub staticGet()";
    }
    public String dynamicGet(){
        return "StaticSub dynamicGet()";
    }
}

class StaticExtand{
    public static void main(String[] args) {
        StaticSuper staticSuper = new StaticSub();
        /**
         * 静态方法，将执行向上转型后(当前对象的实例StaticSuper)的对象的对应方法
         */
        System.out.println(staticSuper.staticGet());
        System.out.println(staticSuper.dynamicGet());

        StaticSub staticSuper1 = new StaticSub();
        /**
         * 静态方法，将执行向上转型后的对象的对应方法
         */
        System.out.println(staticSuper1.staticGet());
        System.out.println(staticSuper1.dynamicGet());
    }
}